<?php
/**
 * Created by PhpStorm.
 * User: yhf
 * Date: 2019-01-23
 * Time: 14:09
 */

namespace app\api\service;

use app\lib\exception\TokenException;
use think\Cache;
use think\Exception;
use think\Request;

class Token
{
    // 生成令牌
    public static function generateToken () {
        // 32个字符组成一组随机字符串(公共类)
        $randChars = getRandChar(32);
        // 用三组字符串，进行md5加密
        $timestamp = $_SERVER['REQUEST_TIME_FLOAT'];
        // salt 盐
        $salt = config('secure.token_salt');

        // 返回md5 加密的三组方法
        return md5($randChars.$timestamp.$salt);
    }

    // 静态公共类 获取缓存数据
    public static function getCurrentTokenVar ($key) {
        // 获取客户端传过来的token
        $token = Request::instance()->header('token');
        // 通过token在缓存中获取要获取的值
        $vars = Cache::get($token);
        // 判断是否存在
        if (!$vars) {
            throw new TokenException();
        } else {
            // 判断如果不是数组就转化为数组
            if (!is_array($vars)) {
                $vars = json_decode($vars,true);
            }
            // 判断数据是否存在，有就返回数据，没有抛出异常
            if (array_key_exists($key,$vars)) {
                return $vars[$key];
            } else {
                throw new Exception('尝试获取的Token变量并不存在');
            }
        }
    }

    // 获取uid
    public static function getCurrentUid () {
        // token
        $uid = self::getCurrentTokenVar('uid');
        return $uid;
    }

    // 获取name
    public static function getCurrentName () {
        // token
        $username = self::getCurrentTokenVar('name');
        return $username;
    }


    // 判断用户是否合法
    public static function isValidOperate ($checkedUID) {
        if (!$checkedUID) {
            throw new Exception('检查UID时必须传入一个被检查的UID');
        }
        $currentOperateUID = self::getCurrentUid();

        return $currentOperateUID == $checkedUID ? true : false;
    }

    // 验证token
    public static  function verifyToken ($token) {
        $exist = Cache::get($token);
        if ($exist) {
            return true;
        } else {
            return false;
        }
    }
}